/*
  类：构造函数的语法糖

    传统的构造函数的问题
      1. 属性和原型方法定义分离，降低可读性
      2. 原型成员可以被枚举
      3. 默认情况下，构造函数仍然可以被当中普通函数使用

    类的特点
      1. 类声明不会被提升，与 let 和 const 一样，存在暂时性死区
      2. 类中的所有代码均在严格模式下执行
      3. 类的所有方法都是不可枚举的
      4. 类的所有方法内部都无法被当中构造函数使用
      5. 类的构造器必须使用 new 来调用
*/
/* function Animal(type, name, age, sex) {
  this.type = type;
  this.name = name;
  this.age = age;
  this.sex = sex;
}

Animal.prototype.print = function () {
  console.log(`${this.type} ${this.name} ${this.age} ${this.sex}`);
};

const a = new Animal("狗", "旺财", 3, "男");
a.print();

// 遍历会遍历原型上的数据
for (const key in a) {
  console.log(key);
} */

class Animal {
  constructor(type, name, age, sex) {
    this.type = type;
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
  print() {
    console.log(`${this.type} ${this.name} ${this.age} ${this.sex}`);
  }
}

const a = new Animal("狗", "旺财", 3, "男");
a.print();
for (const key in a) {
  console.log(key);
}
